[AWS IoT Core] boto3 を使用して Lambda から MQTT v5 で新たに拡張されたプロパティを送受信してみました
1 はじめに
re:Invent 2022 で AWS IoT Core の MQTT v5 対応が発表されましたが、boto3 の IoTDataPlane でも MQTT v5 で拡張されたプロパティを扱うことが可能になっていました。
なお、boto3 の IoTDataPlane は、Signature Version 4 signing processで署名して HTTPS で PUBLISH リクエストができるもので、MQTT v5 で定義されている CONNECT や SUBSCRIBE リクエストに関するものはありません。
今回は、boto3 を使用して、Lambda から MQTT v5 で新たに拡張されたプロパティを Publish してみました。
2 Publish
boto3 の IoTDataPlane Publish のドキュメントには、拡張されたプロパティが指定できるようになっていました。
3 Lambda
Lambda に書いてみたコードは、以下の通りです。
import boto3 import base64 def lambda_handler(event, context): try: client = boto3.client('iot-data') response = client.publish( topic='sensor/device1', qos=1, payload='hello world.', contentType='text/plain', responseTopic='response/device1', messageExpiry=120, correlationData=base64.b64encode(b'test-data').decode(), payloadFormatIndicator='UTF8_DATA', userProperties=[{'key1': 'value1'}, {'key2': 'value2'},{'key3': 'value3'}] ) except Exception as e: print(e)
必要なパーミッションを付与して実行すると、出力は以下のようになりました。
Function Logs START RequestId: 13e163d2-1a74-48a8-9e08-22740f0fa0bf Version: $LATEST Parameter validation failed: Unknown parameter in input: "contentType", must be one of: topic, qos, retain, payload Unknown parameter in input: "responseTopic", must be one of: topic, qos, retain, payload Unknown parameter in input: "messageExpiry", must be one of: topic, qos, retain, payload Unknown parameter in input: "correlationData", must be one of: topic, qos, retain, payload Unknown parameter in input: "payloadFormatIndicator", must be one of: topic, qos, retain, payload Unknown parameter in input: "userProperties", must be one of: topic, qos, retain, payload END RequestId: 13e163d2-1a74-48a8-9e08-22740f0fa0bf REPORT RequestId: 13e163d2-1a74-48a8-9e08-22740f0fa0bf Duration: 775.58 ms Billed Duration: 776 ms Memory Size: 128 MB Max Memory Used: 62 MB Init Duration: 239.19 ms
どうやら、Lambda で利用できる プレインストールのboto3 は、まだ新しいパラメータに対応していないもののようです。
4 Layer
2022/12/07 現在、利用できるバージョンは、1.20.32 のようです。
import botocore import boto3 def lambda_handler(event, context): print('botocore vertion: {0}'.format(botocore.__version__)) print('boto3 vertion: {0}'.format(boto3.__version__))
botocore vertion: 1.23.32 boto3 vertion: 1.20.32
そこで、Layers を使用して、最新の boto3 を利用可能にしました。
参考:Python (Boto 3) Lambda 関数からの「不明なサービス」、「パラメータの検証に失敗しました」、「オブジェクトには属性がありません」というエラーを解決するにはどうすればよいですか?
% LIB_DIR=boto3-mylayer/python % mkdir -p $LIB_DIR % pip3 install boto3 -t $LIB_DIR % cd boto3-mylayer % zip -r /tmp/boto3-mylayer.zip . % aws lambda publish-layer-version --layer-name boto3-mylayer --zip-file fileb:///tmp/boto3-mylayer.zip { "Content": { "Location": "https://**** ・・・略・・・ "CodeSize": 12003232 }, "LayerArn": "arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxx:layer:boto3-mylayer", "LayerVersionArn": "arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxx:layer:boto3-mylayer:1", "Description": "", "CreatedDate": "2022-12-06T16:46:52.694+0000", "Version": 1 }
追加した Layer を Lambda で利用します。
バージョンは、 最新の 1.26.23になりました。
botocore vertion: 1.29.23 boto3 vertion: 1.26.23
5 動作確認
boto3 のバージョンを 1.26.23にすると、エラーなく実行できます。
MQTT テストクライアントで確認してみます。
表示された内容です。 設定した拡張プロパティの値が確認できます。
6 最後に
今回は、Lambda から MQTT v5 で新たに拡張されたプロパティを Publish してみました。
実は、今回、Publish のパラメータにあった、messageExpiryに値を設定したのですが、MQTT テストクライアントのメッセージの有効期間には、残り有効期間(秒)が表示されませんでした。
何か、分かる方おられましたら、ぜひ、教えてやってください。
7 参考リンク
[AWS IoT Core] MQTT v5 を使用してリクエスト・レスポンス パターンを実装して見ました
[AWS IoT Core] MQTT v5 を使用してユーザープロパティを実装して見ました
[AWS IoT Core] MQTT v5 を使用してトピック・エイリアスを実装して見ました
[AWS IoT Core] MQTT v5 を使用してメッセージ及び、セッション有効期限とクリーンスタートを実装して見ました
[AWS IoT Core] MQTT v5 を使用してレスポンスコードの確認を実装して見ました
[AWS IoT Core] MQTT v5 を使用してフォーマット識別要素で判別する Payload のパースを実装して見ました
[AWS IoT Core] MQTT v5 に対応した 「MQTT テストクライアント」の動作を確認して見ました
[AWS IoT Core] MQTT v5 で追加されたユーザープロパティを ルール で取得して Lambda で使用してみました
[AWS IoT Core] AWS IoT Device SDK v2 for Python で MQTT5 のサポートが始まりました (Developer Preview)
[AWS IoT Core] MQTT v5 で新たに追加されたプロパティ値を Republish で追加してみました
[AWS IoT Core] AWS IoT Device SDK v2 for Python を使用して MQTT v5 で新たに拡張されたプロパティを送受信してみました